#include <stdio.h>
#include <stdlib.h>

typedef int ElemSet; /* 物品价值为整数 */
typedef struct ObjNode *Objects;
struct ObjNode {
    int w; /* 重量 */
    ElemSet v; /* 价值 */
};

ElemSet **Create2DArray(int row, int col) {
    /* 动态声明row行col列的二维数组 */
    ElemSet *a, **t;
    int i;

    a = (ElemSet *)malloc(sizeof(ElemSet) * row * col);
    t = (ElemSet **)malloc(sizeof(ElemSet *) * row);
    for (i = 0; i < row; i++)
        t[i] = &a[col * i];
    return t;
}

void Free2DArray(ElemSet **t) {
    /* 释放二维数组空间 */
    free(t[0]);
    free(t);
}

/* 算法15-14：整数重量限制下离散背包问题的动态规划解法 Knapsack01( W, s, opt, n ) */
ElemSet Knapsack01(int W, Objects s, int *opt, int n) {
    ElemSet **f, **x, ret;
    int i, w;

    f = Create2DArray(W + 1,
                      n); /* f[w][i]存储背包承重w和物品集合s[i]~s[n]对应子问题的优化函数最优值 */
    x = Create2DArray(W + 1,
                      n); /* x[w][i]存储背包承重w和物品集合s[i]~s[n]对应子问题的最优选择 */
    for (i = 0; i < n; i++) {
        f[0][i] = 0.0; /* 承重为0时最大价值为0.0 */
    }
    for (w = W; w >= 0; w--) { /* 存储最小规模子问题的解 */
        if (w < s[n - 1].w) {
            f[w][n - 1] = 0.0;
            x[w][n - 1] = 0;
        } else {
            f[w][n - 1] = s[n - 1].v;
            x[w][n - 1] = 1;
        }
    }
    for (i = n - 2; i >= 0; i--) {
        for (w = 1; w <= W; w++) {
            f[w][i] = f[w][i + 1]; /* 先默认舍弃s[i] */
            x[w][i] = 0;
            if (w >= s[i].w
                     && f[w][i] < (s[i].v + f[w - s[i].w][i + 1])) { /* 如果放入背包结果更好 */
                f[w][i] = s[i].v + f[w - s[i].w][i + 1]; /* 则将s[i]放入背包 */
                x[w][i] = 1;
            }
        }
    }
    ret = f[W][0]; /* 结束计算时，f[W][0] 中存储的是优化函数的最优值 */
    opt[0] = x[W][0]; /* 承重为W时第1个物品的最优解 */
    for (i = 1; i < n; i++) { /* 获得剩余物品的最优解 */
        if (opt[i - 1] == 1) { /* 如果前一个物品被放入背包 */
            opt[i] = x[W - s[i -
                             1].w][i]; /* 则下一个物品对应承重为W-s[i-1].w时的最优解 */
            W -= s[i - 1].w; /* 更新当前剩余承重 */
        } else { /* 如果前一个物品被舍弃 */
            opt[i] = x[W][i]; /* 则下一个物品对应承重不变的最优解 */
        }
    }
    Free2DArray(f);
    Free2DArray(x);

    return ret;
}
/* 算法15-14 结束 */

int main(void) {
    Objects s;
    int W;
    int *opt;
    int n, i;

    scanf("%d %d", &n, &W);
    s = (Objects)malloc(sizeof(struct ObjNode) * n);
    opt = (int *)malloc(sizeof(int) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &s[i].w);
    }
    for (i = 0; i < n; i++) {
        scanf("%d", &s[i].v);
    }
    printf("%d\n", Knapsack01(W, s, opt, n));
    for (i = 0; i < n; i++) {
        printf("%d ", opt[i]);
    }
    return 0;
}